﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Bibilioteca.Dominio;
using Bibilioteca.Models;

namespace Bibilioteca.Controllers
{
    public class MaterialesController : Controller
    {
        NegocioMateriales negocioMateriales = new NegocioMateriales();
        private NegocioTiposMateriales tiposMateriales = new NegocioTiposMateriales();
        private NegocioEditoriales editoriales = new NegocioEditoriales();
        private NegocioCatalogos catalogos = new NegocioCatalogos();
        private NegocioAutores autores = new NegocioAutores();
        private NegocioEjemplares ejemplares = new NegocioEjemplares();
        NegocioLogin negocioLogin = new NegocioLogin();

        private List<SelectListItem> GetTipos()
        {
            List<SelectListItem> _tipos = new List<SelectListItem>();

            foreach (TipoMaterial tip in tiposMateriales.todosLosTiposMateriales())
            {
                  _tipos.Add(new SelectListItem() { Text = tip.Nombre, Value = tip.Id.ToString() });
            }
            return _tipos;            
        }

        private List<SelectListItem> GetEditoriales()
        {
            List<SelectListItem> _tipos = new List<SelectListItem>();

            foreach (Editorial tip in editoriales.todosLosEditoriales())
            {
                _tipos.Add(new SelectListItem() { Text = tip.Nombre, Value = tip.Id.ToString() });
            }
            return _tipos;
        }

        private List<SelectListItem> GetCatalogos()
        {
            List<SelectListItem> _tipos = new List<SelectListItem>();

            foreach (Catalogo tip in catalogos.todosLosCatalogos())
            {
                _tipos.Add(new SelectListItem() { Text = tip.Nombre, Value = tip.Id.ToString() });
            }
            return _tipos;
        }

        
        private List<SelectListItem> GetAutoresParaIndex()
        {
            List<SelectListItem> _tipos = new List<SelectListItem>();

            foreach (Autor tip in autores.todosLosAutores())
            {
                _tipos.Add(new SelectListItem() { Text = tip.Apellido+" "+tip.Nombre+" ", Value = tip.Id.ToString() });
            }
            return _tipos;
        }
        
        /*
         * Retorna un string con los autores del material
         * pasado por parametro.
         */
        private string GetAutoresParaDetails(string id)
        {
            string retorno = "";
            bool primerAutor = true;
            foreach (Autor tip in autores.GetAutoresDeMaterial(id))
            {
                if (primerAutor) { primerAutor = false; }
                else retorno += ", ";
                retorno += tip.Apellido+" "+tip.Nombre;
            }
            return retorno;
        }

        private string GetTipoMaterialParaDetails(string id)
        {
            return tiposMateriales.GetTipoMaterialDeMaterial(id).Nombre;
        }

        private string GetCatalogoParaDetails(string id)
        {
            return catalogos.GetCatalogoDeMaterial(id).Nombre;
        }

        private string GetEditorialParaDetails(string id)
        {
            return editoriales.GetEditorialDeMaterial(id).Nombre;
        }

        private List<string[]> GetEjemplaresParaDetails(string id)
        {
            List<string[]> retorno = new List<string[]>();
            foreach (Ejemplar e in ejemplares.GetEjemplaresDeMaterial(id.ToString()))
            {
                string[] cadena = {e.Id.ToString(), e.Estado};
                retorno.Add(cadena);
            }

            return retorno;
        }
        
        private MultiSelectList GetAutores(string[] selectedValues)
        {

            List<Autor> _autores = new List<Autor>();
            foreach (Autor tip in autores.todosLosAutores())
            {
                _autores.Add(new Autor(tip.Id,tip.Nombre+" "+tip.Apellido,tip.Apellido));
            }


            return new MultiSelectList(_autores, "ID", "Nombre", selectedValues);
        }


        //
        // GET: /Materiales/

        public ActionResult Index()
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            ViewBag.Autores = GetAutoresParaIndex();
            ViewBag.TiposMateriales = GetTipos();
            ViewBag.Catalogos = GetCatalogos();
            ViewBag.Editoriales = GetEditoriales();
            return View(negocioMateriales.todosLosMateriales());
        }

        //
        // GET: /Materiales/Details/5

        public ActionResult Details(int id)
        {
            ViewBag.Ejemplares = GetEjemplaresParaDetails(id.ToString());
            ViewBag.Autores = GetAutoresParaDetails(id.ToString());
            
            ViewBag.TiposMateriales = GetTipoMaterialParaDetails(id.ToString());
            
            ViewBag.Catalogos = GetCatalogoParaDetails(id.ToString());
            
            ViewBag.Editoriales = GetEditorialParaDetails(id.ToString());
            return View(negocioMateriales.GetMaterialNumero(id.ToString()));
        }

        //
        // GET: /Materiales/Create

        public ActionResult Create()
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            ViewBag.Autores = GetAutores(null); 
            ViewBag.TiposMateriales = GetTipos();
            ViewBag.Catalogos = GetCatalogos();
            ViewBag.Editoriales = GetEditoriales();
            return View();
        }

        //
        // POST: /Materiales/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                if (ModelState.IsValid)
                {
                    Material s = new Material(
                           0,
                           Convert.ToString(collection["Codigo"]),
                           Convert.ToString(collection["Titulo"]),
                           Convert.ToInt32(collection["SelectedTipoMaterial"]),
                           Convert.ToString(collection["Sinopsis"]),
                           Convert.ToInt32(collection["SelectedEditorial"]),
                           Convert.ToInt32(collection["SelectedCatalogo"]),
                           Convert.ToString(collection["Autores"])
                           );

                    negocioMateriales.insertarMaterial(s);

                    ViewBag.Autores = GetAutoresParaIndex();
                    ViewBag.TiposMateriales = GetTipos();
                    ViewBag.Catalogos = GetCatalogos();
                    ViewBag.Editoriales = GetEditoriales();
            
                    return this.RedirectToAction("Index");
                }
                

                return RedirectToAction("Index");
                
            }
            catch
            {
                ViewBag.Autores = GetAutores(null);
                ViewBag.TiposMateriales = GetTipos();
                ViewBag.Catalogos = GetCatalogos();
                ViewBag.Editoriales = GetEditoriales();
                return View();
            }
        }

        //
        // GET: /Materiales/Edit/5

        public ActionResult Edit(int id)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            ViewBag.Autores = GetAutores(null); 
            ViewBag.TiposMateriales = GetTipos();
            ViewBag.Catalogos = GetCatalogos();
            ViewBag.Editoriales = GetEditoriales();
            return View(negocioMateriales.GetMaterialNumero(id.ToString()));
        }

        //
        // POST: /Materiales/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                if (ModelState.IsValid)
                {
                    Material s = new Material(
                            Convert.ToInt32(collection["Id"]),
                            Convert.ToString(collection["Codigo"]),
                            Convert.ToString(collection["Titulo"]),
                            Convert.ToInt32(collection["SelectedTipoMaterial"]),
                            Convert.ToString(collection["Sinopsis"]),
                            Convert.ToInt32(collection["SelectedEditorial"]),
                            Convert.ToInt32(collection["SelectedCatalogo"]),
                            Convert.ToString(collection["Autores"])
                            );

                    negocioMateriales.modificarMaterial(s);
                }
                ViewBag.Autores = GetAutoresParaIndex();
                ViewBag.TiposMateriales = GetTipos();
                ViewBag.Catalogos = GetCatalogos();
                ViewBag.Editoriales = GetEditoriales();
                return RedirectToAction("Index");
            }
            catch
            {
                ViewBag.Autores = GetAutores(null);
                ViewBag.TiposMateriales = GetTipos();
                ViewBag.Catalogos = GetCatalogos();
                ViewBag.Editoriales = GetEditoriales();
                return View();
            }
        }

        //
        // GET: /Materiales/Delete/5

        public ActionResult Delete(int id)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            ViewBag.TiposMateriales = GetTipos();
            ViewBag.Catalogos = GetCatalogos();
            ViewBag.Editoriales = GetEditoriales();
            return View(negocioMateriales.GetMaterialNumero(id.ToString()));
        }

        //
        // POST: /Materiales/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                negocioMateriales.eliminarMaterial(id);

                return this.RedirectToAction("Index");
            }
            catch
            {
                ViewBag.TiposMateriales = GetTipos();
                ViewBag.Catalogos = GetCatalogos();
                ViewBag.Editoriales = GetEditoriales();
                return View(negocioMateriales.GetMaterialNumero(id.ToString()));
            }
        }
    }
}
